PRCTL(2) | Linux Programmer's Manual | PRCTL(2) |
名前¶
prctl - プロセスの操作を行なう
書式¶
#include <sys/prctl.h> int prctl(int option, unsigned long arg2, unsigned long arg3, unsigned long arg4, unsigned long arg5);
説明¶
prctl() の動作は最初の引き数によって決定される (この値は <linux/prctl.h> に定義されている)。 残りの引き数は最初の引き数によって変化する。 一番目の引き数として以下のものを指定できる:
- PR_CAPBSET_READ (Linux 2.6.25 以降)
- で指定されたケーパビリティが呼び出したスレッドのケーパビリティ
バインディングセット
(capability bounding set)
に含まれている場合、
(関数の返り値として)
1
を返し、そうでない場合
0 を返す
(ケーパビリティ定数は
<linux/capability.h>
で定義されている)。
ケーパビリティバウンディングセットは、
execve(2)
を呼び出した際に、ファイルの許可
(permitted)
ケーパビリティの中で
そのプロセスが獲得できるケーパビリティを指示するものである。
arg2 に指定されたケーパビリティが有効でない場合、 呼び出しはエラー EINVAL で失敗する。
- PR_CAPBSET_DROP (Linux 2.6.25 以降)
- 呼び出したスレッドがケーパビリティ
CAP_SETPCAP
を持っている場合、
呼び出したスレッドのケーパビリティバウンディングセットから
arg2
で指定されたケーパビリティを外す。
呼び出したスレッドの子プロセスは変更後のバウンディングセットを
継承する。
呼び出したスレッドが CAP_SETPCAP を持っていない場合、呼び出しはエラー EPERM で失敗する。 arg2 に指定されたケーパビリティが有効でない場合、 EINVAL で失敗する。 ファイルケーパビリティがカーネルで有効になっていない場合 (この場合にはバウンディングセットがサポートされない)、 EINVAL で失敗する。
- PR_SET_DUMPABLE (Linux 2.3.20 以降)
- (Linux 2.3.20 以降) デフォルトの振る舞いではコアダンプを引き起こすようなシグナルを受信したときに、 コアダンプするかどうかを決定するフラグを設定する (通常このフラグは、デフォルトではセットされているが、 set-user-ID あるいは set-group-ID プログラムが実行されたり、 さまざまなシステムコールによってプロセスの UID や GID が操作されたときに クリアされる)。 2.6.12 以前のカーネルでは、 arg2 は 0 (プロセスはダンプ不可) あるいは 1 (プロセスはダンプ可能) の どちらかでなければならない。 2.6.13 から 2.6.17 までのカーネルでは、値 2 も認められていた。 この値を指定すると、通常はダンプされないバイナリが root だけが 読み込み可能な形でダンプされた。 セキュリティ上の理由から、この機能は削除された (proc(5) の /proc/sys/fs/suid_dumpable の説明も参照)。
- PR_GET_DUMPABLE (Linux 2.3.20 以降)
- (Linux 2.3.20 以降) 呼び出し元プロセスにおけるダンプ可能フラグの 現在の状態を (関数の返り値として) 返す。
- PR_SET_ENDIAN (Linux 2.6.18 以降、PowerPC のみ)
- 呼び出し元プロセスのエンディアン設定 (endian-ness) を arg2 で指定された値に設定する。 指定できる値は PR_ENDIAN_BIG, PR_ENDIAN_LITTLE, PR_ENDIAN_PPC_LITTLE (PowerPC 擬似リトルエンディアン) のいずれか一つである。
- PR_GET_ENDIAN (Linux 2.6.18 以降、PowerPC のみ)
- 呼び出し元プロセスのエンディアン設定 (endian-ness) を (int *) arg2 が指す場所に格納して返す。
- PR_SET_FPEMU (Linux 2.4.18 以降, 2.5.9, ia64 のみ)
- 浮動小数点エミュレーション (floating-point emulation) 制御ビットを arg2 で指定された値に設定する。 指定できる値は PR_FPEMU_NOPRINT (浮動小数点命令アクセスを黙って エミュレートする) か PR_FPEMU_SIGFPE (浮動小数点命令をエミュレートせず、 代わりに SIGFPE を送る) である。
- PR_GET_FPEMU (Linux 2.4.18 以降, 2.5.9, ia64 のみ)
- 浮動小数点エミュレーション制御ビットの値を (int *) arg2 が指す場所に格納して返す。
- PR_SET_FPEXC (Linux 2.4.21 および 2.5.32 以降、PowerPC のみ)
- 浮動小数点例外モード (floating-point exception mode) を arg2 で指定された値に設定する。 指定できるのは以下の値である: PR_FP_EXC_SW_ENABLE (FPEXC で浮動小数点例外を有効にする)、 PR_FP_EXC_DIV (0 除算)、 PR_FP_EXC_OVF (オーバーフロー)、 PR_FP_EXC_UND (アンダーフロー)、 PR_FP_EXC_RES (不正確な結果 (inexact result))、 PR_FP_EXC_INV (不正な命令 (invalid operation))、 PR_FP_EXC_DISABLED (浮動小数点例外を無効にする)、 PR_FP_EXC_NONRECOV (async non-recoverable exception mode)、 PR_FP_EXC_ASYNC (async recoverable exception mode)、 PR_FP_EXC_PRECISE (precise exception mode)。
- PR_GET_FPEXC(Linux 2.4.21 および 2.5.32 以降、PowerPC のみ)
- 浮動小数点例外モードの値を (int *) arg2 が指す場所に格納して返す。
- PR_SET_KEEPCAPS (Linux 2.2.18 以降)
- スレッドの「ケーパビリティ保持」フラグを設定する。 このフラグは、スレッドの実 UID、実効 UID、保存 set-user-ID のうち少なくとも 一つが 0 であった状態から、これら全てが 0 以外に変更されたとき、 スレッドの実効/許可のケーパビリティ集合がクリアされるかどうかを決定する (デフォルトでは、これらのケーパビリティ集合はクリアされる)。 arg2 は 0 (ケーパビリティをクリアする) あるいは 1 (ケーパビリティを保持する) の どちらかでなければならない。 execve(2) が呼び出されると、この値は 0 にリセットされる。
- PR_GET_KEEPCAPS (Linux 2.2.18 以降)
- 呼び出し元スレッドにおける「ケーパビリティ保持」フラグの 現在の状態を (関数の返り値として) 返す。
- PR_SET_NAME (Linux 2.6.9 以降)
- 呼び出し元プロセスのプロセス名を (char *) arg2 が指す場所に格納された値を使って設定する。 名前は最大で 16 バイトであり、 それより少ないバイト数の場合は NULL で終端すべきである。
- PR_GET_NAME (Linux 2.6.11 以降)
- 呼び出し元プロセスのプロセス名を (char *) arg2 が指す場所に格納して返す。 バッファは最大で 16 バイトを格納できるようにすべきである。 返される文字列は、長さが 16 バイトより短い場合は NULL 終端される。
- PR_SET_PDEATHSIG (Linux 2.1.57 以降)
- 親プロセス死亡シグナル (parent process death signal) を arg2 に設定する (設定できるシグナル値の範囲は 1..maxsig であり、0 は通知の解除である)。 呼び出し元プロセスの親プロセスが死んだ際に、ここで設定した値が シグナルとして通知される。この値は fork(2) の子プロセスでは解除される。
- PR_GET_PDEATHSIG (Linux 2.3.15 以降)
- 親プロセス死亡シグナルの現在の値を (int *) arg2 が指す場所に格納して返す。
- PR_SET_SECCOMP (Linux 2.6.23 以降)
- 呼び出したスレッドの secure computing モードを設定する。 現在の実装では、 arg2 は 1 にしなければならない。 secure computing モードを 1 に設定すると、 そのスレッドが呼び出しを許可されるシステムコールは read(2), write(2), _exit(2), sigreturn(2) だけになる。 それ以外のシステムコールを呼び出すと、シグナル SIGKILL が配送される。 パイプやソケットから読み込んだ、信頼できないバイトコードを実行する 必要がある大量の演算を行うアプリケーションにおいて、 secure computing モードは役立つ。 この操作は利用できるのは、カーネルが CONFIG_SECCOMP を有効にして 作成されている場合だけである。
- PR_GET_SECCOMP (Linux 2.6.23 以降)
- 呼び出したスレッドの secure computing モードを返す。 現在の実装 (モードは 1 固定) はあまり役に立たないが、 将来他のモードが実装されると役立つようになるかもしれない。 呼び出したスレッドが secure computing モードでなかった場合、 この操作は 0 を返す。 呼び出したスレッドが secure computing モードの場合、 prctl() を呼び出すとシグナル SIGKILL がそのプロセスに送信される。 この操作が利用できるのは、カーネルが CONFIG_SECCOMP を有効にして 作成されている場合だけである。
- PR_SET_SECUREBITS (Linux 2.6.26 以降)
- 呼び出したスレッドの "securebits" フラグを arg2 で渡された値に設定する。 capabilities(7) 参照。
- PR_GET_SECUREBITS (Linux 2.6.26 以降)
- 呼び出したスレッドの "securebits" フラグを (関数の返り値として) 返す。 capabilities(7) 参照。
- PR_SET_TIMING (Linux 2.6.0-test4 以降)
- (通常の、伝統的に使われてきた) 統計的なプロセスタイミングを使用するか、 正確なタイムスタンプに基づくプロセスタイミングを使用するかを設定する。 arg2 に指定できる値は PR_TIMING_STATISTICAL か PR_TIMING_TIMESTAMP である。 PR_TIMING_TIMESTAMP は現在のところ実装されていない (このモードに設定しようとするとエラー EINVAL が起こることだろう)。
- PR_GET_TIMING (Linux 2.6.0-test4 以降)
- 現在使用中のプロセスタイミングを決める方法を返す。
- PR_SET_TSC (Linux 2.6.26 以降, x86 のみ)
- そのプロセスがタイムスタンプ・カウンタを読み出せるかを決定する フラグの状態を設定する。 読み出しを許可する場合は arg2 に PR_TSC_ENABLE を、そのプロセスがタイムスタンプ・カウンタを読み出そうとした際に SIGSEGV を発生させる場合には PR_TSC_SIGSEGV を渡す。
- PR_GET_TSC (Linux 2.6.26 以降, x86 のみ)
- そのプロセスがタイムスタンプ・カウンタを読み出せるかを決定する フラグの状態を (int *) arg2 が指す場所に格納して返す。
- PR_SET_UNALIGN
- (ia64 では Linux 2.3.48 以降; parisc では Linux 2.6.15 以降; PowerPC では Linux 2.6.18 以降; Alpha では Linux 2.6.22 以降; これらのアーキテクチャのみ) unaligned アクセス制御ビットを arg2 で指定された値に設定する。 指定できる値は PR_UNALIGN_NOPRINT (unaligned なユーザアクセスを黙って 修正する) か PR_UNALIGN_SIGBUS (unaligned なユーザアクセスがあった場合 SIGBUS を生成する) である。
- PR_GET_UNALIGN
- (バージョンとアーキテクチャの情報は PR_SET_UNALIGN 参照) unaligned アクセス制御ビットの値を (int *) arg2 が指す場所に格納して返す。
返り値¶
成功すると、 PR_GET_DUMPABLE, PR_GET_KEEPCAPS, PR_CAPBSET_READ, PR_GET_TIMING, PR_GET_SECUREBITS, PR_GET_SECCOMP は上述の負でない値を返す (PR_GET_SECCOMP は返らない場合もある)。 option が他の値の場合は成功時に 0 を返す。 エラーの場合、-1 を返し、 errno に適切な値を設定する。
エラー¶
- EFAULT
- arg2 が不正なアドレスである。
- EINVAL
- option の値が理解できない。
- EINVAL
- arg2 が指定された option で有効な値ではない。
- EINVAL
- option が PR_SET_SECCOMP か PR_GET_SECCOMP だが、カーネルが CONFIG_SECCOMP を有効にして作成されていなかった。
- EPERM
- option が PR_SET_SECUREBITS で、呼び出し元がケーパビリティ CAP_SETPCAP を持っていない。 または、"locked" フラグを解除しようとした。 または、locked フラグがセットされているフラグをセットしようとした (capabilities(7) 参照)。
- EPERM
- option が PR_SET_KEEPCAPS で、呼び出し元のフラグ SECURE_KEEP_CAPS_LOCKED がセットされている (capabilities(7) 参照)。
- EPERM
- option が PR_CAPBSET_DROP で、呼び出し元がケーパビリティ CAP_SETPCAP を持っていない。
バージョン¶
prctl() システムコールは Linux 2.1.57 で導入された。
準拠¶
このコールは Linux 特有である。 IRIX には prctl() システム・コールがあるが (MIPS アーキテクチャにおいて irix_prctl として Linux 2.1.44 で同様に導入された)、 そのプロトタイプは
ptrdiff_t prctl(int option, int arg2, int arg3);
である。ユーザー当りのプロセス最大数を取得するオプション、 プロセスの使用できる最大プロッサー数を取得するオプション、 現在特定のプロセスが停止(block)させられているかどうか調べるオプション、 スタックサイズの最大値の取得や設定を行なうオプションなどがある。
関連項目¶
2008-07-16 | Linux |